import * as XLSX from 'xlsx'
import { ElMessage } from 'element-plus'

/**
 * Excel导出Hook
 * @returns {Object} 导出相关方法
 */
export function useExcelExport() {
  
  /**
   * 导出数据到Excel
   * @param {Array} data - 要导出的数据数组
   * @param {String} fileName - 文件名（不包含扩展名）
   * @param {String} sheetName - 工作表名称，默认为'Sheet1'
   * @param {Array} columnWidths - 列宽配置数组，格式：[{wch: 20}, {wch: 15}]
   * @returns {Promise}
   */
  const exportToExcel = (data, fileName = '导出数据', sheetName = 'Sheet1', columnWidths = null) => {
    return new Promise((resolve, reject) => {
      try {
        if (!data || data.length === 0) {
          ElMessage.warning('没有数据可导出')
          reject(new Error('没有数据可导出'))
          return
        }

        // 创建工作簿
        const wb = XLSX.utils.book_new()
        
        // 创建工作表
        const ws = XLSX.utils.json_to_sheet(data)
        
        // 设置列宽（如果提供）
        if (columnWidths && Array.isArray(columnWidths)) {
          ws['!cols'] = columnWidths
        }
        
        // 添加工作表到工作簿
        XLSX.utils.book_append_sheet(wb, ws, sheetName)
        
        // 生成Excel文件
        const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' })
        
        // 创建Blob对象
        const blob = new Blob([wbout], { type: 'application/octet-stream' })
        
        // 创建下载链接
        const url = URL.createObjectURL(blob)
        const link = document.createElement('a')
        link.href = url
        link.download = `${fileName}_${new Date().toISOString().slice(0, 10)}.xlsx`
        
        // 触发下载
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
        
        // 清理URL对象
        URL.revokeObjectURL(url)
        
        resolve()
      } catch (error) {
        console.error('Excel导出失败:', error)
        reject(error)
      }
    })
  }

  /**
   * 导出列表数据的通用方法
   * @param {Function} fetchDataFn - 获取数据的函数，应返回Promise
   * @param {Function} mapDataFn - 数据映射函数，将原始数据转换为导出格式
   * @param {String} fileName - 文件名
   * @param {Array} columnWidths - 列宽配置
   * @param {String} sheetName - 工作表名称
   */
  const exportListData = async (fetchDataFn, mapDataFn, fileName, columnWidths = null, sheetName = 'Sheet1') => {
    try {
      ElMessage.info('正在获取数据...')
      
      // 获取数据
      const rawData = await fetchDataFn()
      
      if (!rawData || rawData.length === 0) {
        ElMessage.warning('没有数据可导出')
        return
      }

      ElMessage.info('正在生成Excel文件...')
      
      // 映射数据
      const exportData = rawData.map(mapDataFn)
      
      // 导出Excel
      await exportToExcel(exportData, fileName, sheetName, columnWidths)
      
      ElMessage.success('导出成功')
    } catch (error) {
      console.error('导出失败:', error)
      ElMessage.error('导出失败: ' + (error.message || '未知错误'))
    }
  }

  /**
   * 常用的列宽配置
   */
  const columnWidthPresets = {
    // 基础信息列宽
    basic: [
      { wch: 10 }, // ID
      { wch: 20 }, // 名称
      { wch: 15 }, // 联系人
      { wch: 15 }, // 电话
      { wch: 25 }, // 邮箱
      { wch: 12 }, // 状态
      { wch: 20 }  // 时间
    ],
    
    // 展商信息列宽
    exhibitor: [
      { wch: 25 }, // 公司名称
      { wch: 15 }, // 联系人
      { wch: 15 }, // 职务
      { wch: 15 }, // 联系电话
      { wch: 25 }, // 联系邮箱
      { wch: 12 }, // 展位号
      { wch: 30 }, // 行业分类
      { wch: 35 }, // 公司地址
      { wch: 25 }, // 公司网站
      { wch: 12 }, // 审核状态
      { wch: 20 }, // 申请时间
      { wch: 40 }  // 公司描述
    ],
    
    // 活动信息列宽
    activity: [
      { wch: 25 }, // 活动名称
      { wch: 15 }, // 活动类型
      { wch: 20 }, // 开始时间
      { wch: 20 }, // 结束时间
      { wch: 15 }, // 地点
      { wch: 12 }, // 状态
      { wch: 40 }  // 描述
    ],

    // 报名信息列宽
    registration: [
      { wch: 10 }, // ID
      { wch: 15 }, // 姓名
      { wch: 25 }, // 公司
      { wch: 20 }, // 职位
      { wch: 15 }, // 电话
      { wch: 25 }, // 邮箱
      { wch: 20 }, // 报名时间
      { wch: 12 }, // 状态
      { wch: 30 }  // 特殊需求
    ],

    // 门票信息列宽
    ticket: [
      { wch: 15 }, // 门票类型
      { wch: 20 }, // 持票人姓名
      { wch: 15 }, // 联系电话
      { wch: 25 }, // 邮箱
      { wch: 20 }, // 购买时间
      { wch: 12 }, // 状态
      { wch: 15 }  // 价格
    ]
  }

  /**
   * 常用的数据映射函数
   */
  const mapperPresets = {
    // 基础状态映射
    getStatusText: (status) => {
      const statusMap = {
        'pending': '待审核',
        'approved': '已通过', 
        'rejected': '已拒绝',
        'active': '启用',
        'inactive': '禁用',
        'draft': '草稿',
        'published': '已发布'
      }
      return statusMap[status] || status
    },

    // 格式化日期
    formatDate: (dateStr) => {
      if (!dateStr) return '-'
      try {
        return new Date(dateStr).toLocaleString('zh-CN')
      } catch {
        return dateStr
      }
    },

    // 处理空值
    handleEmpty: (value) => value || '-'
  }

  return {
    exportToExcel,
    exportListData,
    columnWidthPresets,
    mapperPresets
  }
}

/**
 * 从Excel导入数据的通用方法
 * @param {Object} headerMap - Excel表头到数据字段的映射
 * @param {Function} processDataCallback - 处理解析后数据的回调函数
 */
export function importFromExcel(headerMap, processDataCallback) {
  const input = document.createElement('input')
  input.type = 'file'
  input.accept = '.xlsx, .xls'
  input.onchange = async (e) => {
    const file = e.target.files[0]
    if (!file) return

    ElMessage.info('正在解析Excel文件...')
    try {
      const data = await new Promise((resolve, reject) => {
        const reader = new FileReader()
        reader.onload = (event) => {
          try {
            const workbook = XLSX.read(event.target.result, { type: 'binary' })
            const sheetName = workbook.SheetNames[0]
            const worksheet = workbook.Sheets[sheetName]
            const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 })
            resolve(jsonData)
          } catch (err) {
            reject(err)
          }
        }
        reader.onerror = (error) => reject(error)
        reader.readAsBinaryString(file)
      })

      if (data.length < 2) {
        ElMessage.error('Excel文件为空或没有数据')
        return
      }

      const header = data[0]
      const rows = data.slice(1)
      const parsedData = rows.map(row => {
        const item = {}
        header.forEach((col, index) => {
          if (headerMap[col]) {
            item[headerMap[col]] = row[index]
          }
        })
        return item
      })

      await processDataCallback(parsedData)

    } catch (error) {
      console.error('解析或处理Excel失败:', error)
      ElMessage.error('操作失败，请检查文件格式或联系技术支持')
    }
  }
  input.click()
}